extends CharacterBody2D

# 移除 @export var speed = 100，改为从全局脚本获取
# 移除 @export var max_health = 100，改为从全局脚本获取
# 移除 var current_health = max_health，改为从全局脚本获取并管理
@export var damage_to_player = 10 # 每次碰撞玩家造成的伤害 (这个变量可能是敌人相关，暂不从全局获取)

# @onready var current_health # 无需再在这里声明，因为它现在是全局的

@onready var sprite: Sprite2D = $Sprite2D # 确保你的Sprite2D节点名称是Sprite2D
@onready var animation_player: AnimationPlayer = $AnimationPlayer
@onready var health_bar: ProgressBar = $ProgressBar
@export var bullet_scene: PackedScene # 导出子弹场景，可以在编辑器中拖入

# 新增：用于获取管理子弹的父节点，建议在编辑器中拖拽 Main 场景中的 'WorldEntities' 节点到这里
# 如果你没有这个节点，并且希望子弹直接添加到 Main 根节点下，可以忽略这行
# @export var world_entities_container: Node2D

var last_operation:Dictionary

func _ready() -> void:
	last_operation={#初始化上下沿结构体
		"射击":0,
		"左":0,
		"上":0,
		"下":0,
		"右":0,
		"move":0,
		"":0
	}
	# 初始化血条显示，现在直接使用全局变量
	update_health_bar()
	
func _input(event: InputEvent):
	# 监听鼠标左键点击事件
	if event.is_action_pressed("射击"): 
		shoot()
	
func _physics_process(delta: float) -> void:
	global.update_mouse_world_position()
	var input_direction = Vector2.ZERO
	if Input.is_action_pressed("上"):
		input_direction.y -= 1
	if Input.is_action_pressed("下"):
		input_direction.y += 1
	if Input.is_action_pressed("左"):
		input_direction.x -= 1
	if Input.is_action_pressed("右"):
		input_direction.x += 1
	# 归一化
	if input_direction.length() > 0:
		input_direction = input_direction.normalized()
	
	# 从全局脚本获取速度
	velocity = input_direction * global.speed # <--- 修改这里
	
	# 移动并滑动（CharacterBody2D 的内置方法）
	move_and_slide()
	
	#上升沿下降沿处理
	if !is_invincible:
		if velocity !=Vector2.ZERO and last_operation["move"]==0:
			animation_player.play("shake")
		if velocity ==Vector2.ZERO and last_operation["move"]==1:	
			animation_player.play("RESET")
		
	if velocity !=Vector2.ZERO:
		last_operation["move"]=1
	else:
		last_operation["move"]=0

func shoot():#射击函数
	if bullet_scene == null:
		printerr("Bullet scene is not assigned!")
		return
	print("发射")
	
	var bullet = bullet_scene.instantiate()
	
	# 修改子弹的添加方式以更健壮地处理位置
	# 最好的方式是添加到游戏的“世界”根节点下
	# 假设你的主场景根节点是 Node2D，并且在世界 (0,0) 处
	# 并且你可能已经设置了 "world_root" 组
	var world_root = get_tree().get_first_node_in_group("main") 
	if world_root:
		world_root.add_child(bullet)
		bullet.position = global_position - world_root.global_position
	else:
		# 如果没有 "world_root" 组，回退到 Player 的父节点
		# 确保这个父节点在世界的 (0,0) 处，否则可能仍有偏移
		get_parent().add_child(bullet)
		bullet.position = global_position - get_parent().global_position # <--- 修正子弹位置

	# 3. 计算子弹的发射方向，注意鼠标位置有镜头补偿
	var mouse_world_pos = global.mouse_world_position
	var direction_to_mouse = (mouse_world_pos - global_position).normalized()
	
	# 4. 设置子弹的移动方向
	bullet.direction = direction_to_mouse
	# 5. (可选) 调整子弹的旋转，使其指向移动方向
	bullet.rotation = direction_to_mouse.angle()
	#调试信息
	print(bullet.position)
	print(get_viewport().get_mouse_position())
	print(direction_to_mouse)
@export var invincibility_duration = 1.0 # 可以在编辑器中调整的无敌时间
var is_invincible = false # 新增变量：是否处于无敌状态

func take_damage(amount: int):
	if is_invincible:
		return # 如果无敌，则不掉血
	else:	
		# 播放闪烁动画
		animation_player.play("w_flicker")
		
		# 开启无敌状态
		is_invincible = true
		
		#无敌定时器
		var timer = get_tree().create_timer(invincibility_duration)
		timer.timeout.connect(_on_invincibility_timer_timeout)
		
		# 从全局脚本中扣血，并让全局脚本管理血量更新和死亡判断
		global.now_health -= amount # <--- 修改这里
		global.now_health = clampi(global.now_health, 0, global.max_health) # 确保血量不超限
		
		update_health_bar() # 更新本地血条显示
		
		print(name, " 受到 ", amount, " 点伤害，剩余血量：", global.now_health) # <--- 修改这里
		
		# 死亡判断应该放在全局脚本中更合理，因为全局脚本管理血量
		# 但如果只是简单的判断，也可以在这里
		if global.now_health <= 0: # <--- 修改这里
			die()
		
func die():#死亡而已
	print(name, " 死亡！")
	# 播放死亡动画、音效等
	# 例如：播放一个死亡粒子效果
	# ...
	queue_free() # 销毁玩家节点
	
func _on_invincibility_timer_timeout():#无敌时间定时器
	# 定时器结束后，取消无敌状态
	is_invincible = false
	print("玩家无敌时间结束。")
	animation_player.play("shake") # 播放受伤后的动画

func update_health_bar():#血条更新
	if health_bar:
		# 血条的值现在从全局脚本获取
		health_bar.max_value = global.max_health # <--- 确保血条的最大值也从全局获取
		health_bar.value = global.now_health # <--- 修改这里
